package utilities.print.log;

import utilities.input.arrangement.LogInit;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 日志消息输出类,将在日志文件中同步控制台消息
 */
public class LogMessage implements Log {
    /**
     * 日志信息来源的名字
     */
    private String name;
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static FileWriter outputFile;

    /**
     * 是否输出到控制台
     */
    private boolean isLog = true;

    /**
     * @param name 信息来源的名字
     */
    public LogMessage(String name) {
        this.name = name;
        try {
            outputFile = new FileWriter(LogInit.logOutputFile,true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @param name 信息来源的名字
     * @param isPrint 设置是否显式输出 log 信息
     */
    public LogMessage(String name,boolean isPrint) {
        this.name = name;
        this.isLog = isPrint;
    }

    /**
     * 输出一个日志消息
     * @param message 日志消息
     */
    @Override
    public void print(Object message) {
        String text = "[%s| %s]: %s\n".formatted(name , dateFormat.format(new Date()) , message);
        if (isLog){
            System.out.printf(text);
        }
        try {
            outputFile.write(text);
            outputFile.flush();
        } catch (IOException e) {
            System.out.println("日志记录器无法编写日志!!!");
        }
    }

    public boolean isLog() {
        return isLog;
    }

    public void setLog(boolean log) {
        isLog = log;
    }

    /**
     * 关闭日志输出文件流
     */
    public void closeOutputFile(){
        try {
            outputFile.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
